/*
 * @Descripttion: 认证中间件
 * @version: 
 * @Author: 一氧化二氢
 * @Date: 2022-01-02 17:20:55
 * @lastEditorTime: Do no edit
 */

//导入jwt模块
const { TokenExpiredError } = require('jsonwebtoken')
const jwt = require('jsonwebtoken')
const app = require('../app')
//导入jwt密钥
const { JWT_SECRET } = require('../config/config.default')
//导入错误类型
const { tokenExpiredError, invalidToken, 
    authTokenError, hasNotAdminPerminssion,
    unSupportedFileType } = require('../constant/err.type')
/**
 * @name:auth 
 * @test: test font
 * @msg: 获取用户登录的token并进行解析
 * @return {*}
 * @param {*} ctx
 * @param {*} next
 */
const auth = async (ctx, next) => {
    //获取请求头中的token
    const { authorization = '' } = ctx.request.header
    const token = authorization.replace('Bearer ', '')
    try {
        //验证是否成功，成功则返回user，user中包含了payload中的信息（id，user_name,is_admin）
        const user = jwt.verify(token, JWT_SECRET)
        ctx.state.user = user
    } catch (err) {

        switch (err.name) {
            case 'TokenExpiredError':
                console.error('token已过期', err)
                return ctx.app.emit('error', tokenExpiredError, ctx)
            case 'JsonWebTokenError':
                console.error('无效的token', err)
                return ctx.app.emit('error', invalidToken, ctx)
            default:
                console.error('验证失败', err)
                return ctx.app.emit('error', authTokenError, ctx)
        }
    }

    await next()
}

/**
 * @name: 
 * @test: test font
 * @msg: 判断是否拥有管理员权限
 * @return {*}
 * @param {*} ctx
 * @param {*} next
 */
const hadAdminPermission = async (ctx, next) => {
    const { is_admin } = ctx.state.user
    if (!is_admin) {
        console.error("该用户没有管理员权限", ctx.state.user)
        return ctx.app.emit('error', hasNotAdminPerminssion, ctx)
    }
    await next()
}



module.exports = {
    auth,
    hadAdminPermission,
}